/**
 * Description: SLE多节点连接管理链表，用于存储SLE客户端所连接的节点信息. \n
 *              使用单向链表存储节点信息, 链表头指针为 sle_node_list_t *g_sle_NodeList_head \n
 *                                      链表节点数量为 uint16_t g_sle_NodeList_count \n
 *
 * History: \n
 * 2025-05-14, Create file. \n
 */

#ifndef SLE_NODE_LIST_H
#define SLE_NODE_LIST_H

#include "sle_client.h"

// SLE节点信息结构体定义
typedef struct sle_device_info
{
    uint16_t sle_conn_id;                           // sle连接id
    char sle_device_type[SLE_ADV_VALUE_MAX_LENGTH]; // sle设备类型
    sle_addr_t sle_device_addr;                     // sle设备地址
} sle_device_info_t;

// SLE节点存储链表结构体定义
typedef struct sle_node_list
{
    struct sle_device_info device_info; // 节点信息
    struct sle_node_list *next;         // 下一个节点
} sle_node_list_t;

extern sle_node_list_t *g_sle_NodeList_head; // 链表头指针
extern uint16_t g_sle_NodeList_count;        // 链表节点数量


/**
 * @brief  初始化SLE节点链表.
 * @param  无
 * @return errcode_t 成功返回 ERRCODE_SUCC ，失败返回其他错误码
 */
errcode_t SLE_NodeList_Init(void);

/**
 * @brief  销毁SLE节点链表.
 * @param  无
 * @return errcode_t 成功返回 ERRCODE_SUCC ，失败返回其他错误码
 */
errcode_t SLE_NodeList_Destroy(void);

/**
 * @brief  添加SLE节点到链表.
 * @param  [in]    conn_id 节点连接ID
 * @param  [in]    device_type 节点类型
 * @param  [in]    device_type_len 节点类型长度
 * @param  [in]    addr 节点地址
 * @return errcode_t 成功返回 ERRCODE_SUCC ，失败返回其他错误码
 * @note   1. 链表需要调用 SLE_NodeList_Init() 函数初始化，否则添加失败
 *         2. device_type 和 addr 不能为空，且 device_type 数据长度不能超过 SLE_ADV_VALUE_MAX_LENGTH
 *         3. 链表节点数量 g_sle_NodeList_count 不能超过 SLE_NODE_LIST_MAX_COUNT
 */
errcode_t SLE_NodeList_Add(uint16_t conn_id, char *device_type, uint16_t device_type_len, const sle_addr_t *addr);

/**
 * @brief 根据节点的addr，从节点列表中删除指定节点
 * @param  [in]    addr 需要删除节点的地址
 * @return errcode_t 成功返回 ERRCODE_SUCC ，失败返回其他错误码
 * @note   1. 链表需要调用 SLE_NodeList_Init() 函数初始化，否则添加失败
 *         2. addr 不能为空
 * */
errcode_t SLE_NodeList_Remove(const sle_addr_t *addr);

/**
 * @brief 根据节点的设备类型，获取节点地址
 * @param device_type 设备类型
 * @param device_type_len 设备类型长度
 * @return sle_node_list_t 指向查找到节点的地址，NULL表示未找到
 * @note   1. 链表需要调用 SLE_NodeList_Init() 函数初始化，否则添加失败
 *         2. device_type 不能为空，且 device_type 数据长度不能超过 SLE_ADV_VALUE_MAX_LENGTH
 * */
sle_node_list_t *SLE_NodeList_Find(char *device_type, uint16_t device_type_len);

/**
 * @brief  显示链表节点信息
 * @param  无
 * @return errcode_t 成功返回 ERRCODE_SUCC ，失败返回其他错误码
 * @note   1. 链表需要调用 SLE_NodeList_Init() 函数初始化，否则添加失败
 */
errcode_t SLE_NodeList_Print(void);

#endif